package org.example.reflect;

import org.example.reflect.common.Entity;
import org.example.reflect.common.Vo;
import org.example.reflect.entity.UserEntity;
import org.example.reflect.vo.UserVo;

import java.lang.reflect.Method;

public class ReflectObjectDemo {

    public static void main(String[] args) throws Exception {
        // 初始化entity转换对象
        UserEntity userEntity = new UserEntity();
        userEntity.setUserId("123");
        userEntity.setUserName("张三");
        userEntity.setPhone("176****1021");
        userEntity.setAge(10L);

        Vo vo = toVo(userEntity, UserVo.class);

        System.out.println(vo);
    }

    public static  <T extends Vo> T toVo(Entity entity, Class<? extends Vo> classType) throws Exception {
        // 利用反射将entity转化为vo对象
        Class<?> entityClass = entity.getClass();
        Class<?> voClass = classType;
        //获取entity对应的方法集合
        Method[] entityClassmethods = entityClass.getMethods();
        //获取vo对应的方法集合
        Method[] voClassMethods = voClass.getMethods();

        // 创建要转化的vo对象
        Object vo = voClass.newInstance();
        for (Method entityClassmethod : entityClassmethods) {
            //获取 entity的方法名
            String entityMethodName = entityClassmethod.getName();
            //判断是不是set*方法名
            if (entityMethodName.startsWith("set")) {
                for (Method voClassMethod : voClassMethods) {
                    //判断vo中是否存在对应的set*方法名
                    if (entityMethodName.equals(voClassMethod.getName())) {
                        //获取entity的get方法
                        String entityGetMethodName = "g" + entityMethodName.substring(1);
                        Method method = entityClass.getMethod(entityGetMethodName);
                        voClassMethod.invoke(vo, method.invoke(entity));
                    }
                }
            }
        }
        return (T) classType.cast(vo);
    }
}
